package com.powernode.driver.service.impl;

import com.alibaba.nacos.common.codec.Base64;
import com.powernode.driver.properties.TencentProperties;
import com.powernode.driver.service.CosService;
import com.powernode.driver.service.OcrService;
import com.powernode.model.vo.driver.CosUploadVo;
import com.powernode.model.vo.driver.IdCardOcrVo;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.ocr.v20181119.OcrClient;
import com.tencentcloudapi.ocr.v20181119.models.IDCardOCRRequest;
import com.tencentcloudapi.ocr.v20181119.models.IDCardOCRResponse;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.format.DateTimeFormat;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Date;

/**
 * 身份证OCR识别服务实现类
 * 1. 识别身份证文字信息
 * 2. 存储图片到COS对象存储
 */
@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class OcrServiceImpl implements OcrService {
    @Resource
    private TencentProperties tencentProperties;
    @Resource
    private CosService cosService;

    /**
     * 身份证OCR识别服务
     * 1. 识别身份证文字信息
     * 2. 存储图片到COS对象存储
     *
     * @param file 上传的身份证图片文件
     * @return 身份证识别结果信息
     */
    @Override
    public IdCardOcrVo idCardOcr(MultipartFile file) {
        try {
            // 将文件转换为Base64编码字符串
            byte[] bytes = Base64.encodeBase64(file.getBytes());
            String idCardBase64 = new String(bytes);

            // 初始化腾讯云OCR客户端
            Credential credential = new Credential(tencentProperties.getSecretId(), tencentProperties.getSecretKey());
            OcrClient ocrClient = new OcrClient(credential, tencentProperties.getRegion());

            // 创建身份证OCR请求
            IDCardOCRRequest idCardOCRRequest = new IDCardOCRRequest();
            idCardOCRRequest.setImageBase64(idCardBase64);

            // 执行OCR识别
            IDCardOCRResponse idCardOCRResponse = ocrClient.IDCardOCR(idCardOCRRequest);

            IdCardOcrVo idCardOcrVo = new IdCardOcrVo();

            // 处理身份证正面信息（包含姓名、出生日期、性别等信息）
            if (StringUtils.hasText(idCardOCRResponse.getName())) {
                idCardOcrVo.setName(idCardOCRResponse.getName());
                /*
                代码解释：
                response.getBirth().toString() - 从身份证识别响应中获取出生日期并转换为字符串
                DateTimeFormat.forPattern("yyyy/MM/dd") - 创建Joda-Time日期格式化器，指定格式为"年/月/日"
                .parseDateTime(...) - 使用指定的格式解析日期字符串，返回DateTime对象
                .toDate() - 将Joda-Time的DateTime对象转换为标准的Java Date对象
                 */
                Date date = DateTimeFormat.forPattern("yyyy/MM/dd").parseDateTime(idCardOCRResponse.getBirth().toString()).toDate();
                idCardOcrVo.setBirthday(date);
                // 设置性别（"男"转换为"1"，其他为"2"）
                idCardOcrVo.setGender("男".equals(idCardOCRResponse.getSex()) ? "1" : "2");
                idCardOcrVo.setIdcardAddress(idCardOCRResponse.getAddress());
                idCardOcrVo.setIdcardNo(idCardOCRResponse.getIdNum());

                // 上传身份证正面图片到COS
                CosUploadVo cosUploadVo = cosService.upload(file, "idCard");
                idCardOcrVo.setIdcardFrontUrl(cosUploadVo.getUrl());
                idCardOcrVo.setIdcardFrontShowUrl(cosUploadVo.getShowUrl());
            } else {
                // 处理身份证背面信息（主要包含有效期信息）
                String idcardExpire = idCardOCRResponse.getValidDate().split("-")[1];

                // 解析有效期日期字符串为Date对象
                /*代码解释：
                idcardExpire - 身份证有效期字符串，格式应为"年.月.日"（如："2025.12.31"）
                DateTimeFormat.forPattern("yyyy.MM.dd") - 创建Joda-Time日期格式化器，指定格式为"年.月.日"
                .parseDateTime(idcardExpire) - 使用指定的格式解析有效期字符串，返回DateTime对象
                .toDate() - 将Joda-Time的DateTime对象转换为标准的Java Date对象
                 */
                Date date = DateTimeFormat.forPattern("yyyy.MM.dd").parseDateTime(idcardExpire).toDate();

                // 设置过期时间
                idCardOcrVo.setIdcardExpire(date);

                // 上传身份证背面图片到COS
                CosUploadVo cosUploadVo = cosService.upload(file, "idCard");
                idCardOcrVo.setIdcardBackUrl(cosUploadVo.getUrl());
                idCardOcrVo.setIdcardBackShowUrl(cosUploadVo.getShowUrl());
            }
            return idCardOcrVo;
        } catch (IOException | TencentCloudSDKException e) {
            // 处理异常情况
            throw new RuntimeException(e);
        }
    }
}
